home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / itw / itw_main.bas next >
BASIC Source File  |  2000-06-04  |  30KB  |  1,083 lines

  1.   /**                                            */
  2.  /**    『In the Water』 < Ver.1.03 >        1996,2000  TAU Software    */
  3. /**                                            */
  4. /*                 for 「ぺけ-BASIC  ver.0.02  H7/11/22版」以降    */
  5. /*                                            */
  6.  
  7. /******************/
  8. /***  変数宣言  ***/
  9. /******************/
  10.  
  11. int cnt_ct,ttm,tms        /*  コンティニュー回数、トータルタイム・ミス
  12. int energy,e_max,heart        /*  エネルギー、最大ENERGY値、ハート(REST)
  13. int cursol=0,tl_ck=0        /*  カーソル位置(タイトル)、タイトル用チェック
  14. int prac=1,prac_max=1        /*  練習面、最大練習面
  15. int chk_end=0            /*  エンディングメッセージ用チェック
  16.  
  17. int anime_ct=0            /*  アニメ用カウンタ
  18. dim int ac2(8)={  0, 32, 64, 96,128,160,192,224,256}
  19. dim int txd(383)        /*  PCG DATA (TEXT)
  20. dim int amd(287)        /*  PCG DATA アニメーション用
  21. dim int vmap(16,13)        /*  仮想画面 (0:water  1:koin  2:slime  3:block)
  22.  
  23. dim int recs(2)={ -1,-1,-1 }                    /*  ベストタイム(トータル)
  24. dim int times(11)={ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }    /*  ステージ別タイム
  25.  
  26. int save_mode=1        /*  セーブ(0:OFF 1:ON)
  27. int music_mode=1    /*  音楽(0:OFF 1:ON)
  28.  
  29.  
  30. /********************************/
  31. /***  定数(変数だけど・・・)  ***/
  32. /********************************/
  33.  
  34. int ENERGY_0=64                /*  ENERGY: 初期値(1-128)
  35. int EMAX_0=64,ENERGY_MAX=128        /*          最大初期値(1-128)、最大(128)
  36. int HEART_0=3,HEART_MAX=5        /*  HEART:  初期値(0-9)、最大(0-9)
  37. int HEART_CONT=3            /*          CONTINUE時(0-9)
  38.  
  39. int E_RCV=1                    /*  ENERGY 回復量
  40. dim int E_CNS(2,2)={ 2,3,2, 0,0,0, 1,1,1 }    /*  ENERGY 使用量(key:左上--右上--右下)
  41.  
  42. int MOVE_WAIT=2                    /*  移動・アニメ用ウェイト時間
  43. dim int MV_DAT(3)={ 0,-1,1,0 }            /*  ジョイパッド -> 移動データ 用
  44.  
  45. dim str RANKS(2)={ "1ST","2ND","3RD" }        /*  順位
  46.  
  47. dim str FNAME(5)={ "ITW_TXDT.DAT","ITW_PCG.SP", "ITW_PCG.PAL",        /*  FILES NAME
  48.                    "ITW_MSD.ZPD", "ITW_MSD.ZMD","ITW_RECS.DAT" }
  49. str HEADER="ITW_RECS"
  50.  
  51. int R21
  52. R21=wpeek(&hE8002A)
  53.  
  54.  
  55.  
  56. /**************************/
  57. /***  メイン  ルーチン  ***/
  58. /**************************/
  59. read_file()
  60. init()
  61. main0()
  62. end0()
  63.  
  64. end
  65.  
  66.  
  67.  
  68. /**********************/
  69. /***  メインループ  ***/
  70. /**********************/
  71. func main0()
  72.   int z
  73.   int stg,rt        /*  ステージ番号、返り値
  74.  
  75.   repeat
  76.     rt=title()
  77.     if rt>=0 then{
  78.       wpoke(&hE80016,0)
  79.       if rt=0 then{
  80.         while put_heart(-1)>-1:endwhile
  81.         while heart<HEART_0:put_heart(1):endwhile
  82.         print_emax(EMAX_0)
  83.         energy_ud(0)
  84.         cnt_ct=0
  85.         tms=0:ttm=0
  86.         for stg=1 to 12
  87.           rt=game0(stg,0)
  88.           if rt<>1 then break
  89.         next
  90.         if stg>12 then staff()
  91.       } else{
  92.         print_emax(ENERGY_MAX)
  93.         stg=rt:rt=5
  94.         while rt>4
  95.           while put_heart(-1)>-1:endwhile
  96.           while heart<HEART_CONT:put_heart(1):endwhile
  97.           energy_ud(0)
  98.           rt=game0(stg,1)
  99.           if rt=5 or rt=7 then{
  100.             z=prac_max
  101.             if z>12 and stg<13 then z=12
  102.             stg=((stg+5-rt+z) mod z)+1
  103.             prac=stg:print_letters(160,364,right$("0"+str$(prac),2))
  104.           }
  105.         endwhile
  106.       }
  107.     }
  108.   until rt<=0
  109.  
  110. endfunc
  111.  
  112.  
  113. /******************/
  114. /***  終了処理  ***/
  115. /******************/
  116. func end0()
  117.   int i
  118.  
  119.   if music_mode then m_stop()
  120.   vpage2(0)
  121.   tx_cls(0,0,512,1024)
  122.   wpoke(&hE80014,0):wpoke(&hE80016,0)
  123.   for i=0 to 8:iocs(&h13,i,-2):next
  124.   v_priority("STG")
  125.   wpoke(&hE8002A,R21)
  126. endfunc
  127.  
  128.  
  129. /******************/
  130. /***  タイトル  ***/
  131. /******************/
  132. func title()
  133.   int tm,tmw        /*  タイマ
  134.   int pcs,dx,dy        /*  カーソル位置、移動方向
  135.   int z,jd0,jd,pjd    /*  雑用、返り値、入力
  136.   int stat=0,rt=-1    /*  ステイタス、返り値
  137.   dim int TM0(1)={1340,1720}    /*  画面切替時間
  138.  
  139.   play0(0)
  140.   if tl_ck then{
  141.     if clear_screen() then return(-1)    /*  画面クリア
  142.     fill(14,232,141,241,0)
  143.     print_letters(72,221,"         ")
  144.     print_letters(208,221,"00")
  145.     print_letters(200,236," 0/ 0")
  146.   } else tl_ck=1
  147.   block_pal(prac-1)
  148.   for jd0=1 to 12            /*  左右のキャラ表示
  149.     jd=9-((jd0-1) mod 3)*4
  150.     print_bg(0,1,jd0,jd):print_bg(0,15,jd0,jd)
  151.   next
  152.   wpoke(&hE80016,256)            /*  テキスト画面切替え
  153.  
  154.   play0(1)
  155.   tm=iocs(&h7F)
  156.   tmw=iocs(&h7F)+MOVE_WAIT
  157.   jd0=joy()
  158.   while (iocs(4,0) and iocs(4,2) and 2)=0    /*  ループ ([ESC]+[Q]:強制終了)
  159.     pjd=not(jd0)
  160.     jd0=joy():jd=pjd and jd0    /*  入力
  161.     if stat=0 then{
  162.       dx=MV_DAT((jd shr 2) and 3)
  163.       dy=MV_DAT(jd and 3)
  164.       if cursol=1 and dx then{        /*  練習面指定
  165.         if music_mode then m_play(43)
  166.         z=prac_max
  167.         if z>12 and prac<13 and (jd0 and 64)=0 then z=12
  168.         prac=((prac+dx-1+z) mod z)+1
  169.         print_letters(160,364,right$("0"+str$(prac),2))
  170.       }
  171.       if dy then{            /*  カーソル移動
  172.         if music_mode then m_play(43)
  173.         pcs=cursol:cursol=(cursol+dy+3) mod 3
  174.         print_letters(64,cursol*16+348,">")
  175.         print_letters(64,+pcs*16+348," ")
  176.       }
  177.     }
  178.     if (jd0 and 2) and stat=1 then tm=iocs(&h7F)
  179.     if jd and 32 then{             /*  ボタン押下
  180.       if stat=0 and (jd0 and 4)=0 then{
  181.         if music_mode then m_play(43)
  182.         rt=-(cursol/2)
  183.         if cursol=1 then rt=prac
  184.         break
  185.       }
  186.       tm=tm+TM0(stat)
  187.     }
  188.     if diff_time(tm)>TM0(stat) then {
  189.       stat=1-stat
  190.       v_disp()
  191.       wpoke(&hE80016,stat*256+256)    /*  画面切替え
  192.       play0(stat*4+1)
  193.       tm=iocs(&h7F)
  194.     }
  195.     if diff_time(tmw)>=MOVE_WAIT then{
  196.       if not(bpeek(&hE88001) and &h10) then tmw=iocs(&h7F):anime() }    /*  アニメ
  197.   endwhile
  198.  
  199.   return(rt)    /* rt= 0:START GAME   1-12:PRACTICE   -1:EXIT
  200. endfunc
  201.  
  202.  
  203. /***********************/
  204. /***  ゲーム (MAIN)  ***/
  205. /***********************/
  206. func game0(stg,md)        /*  stg: ステージ番号   md:モード(0;通常 1;練習)
  207.  
  208.   int jd,pjd,st,kd        /*  入力
  209.   int mx,my,mx2,my2,xz,yz,dr    /*  マイキャラの位置、座標(xz,yz)、向き(dr)
  210.   int dx,dy,dz            /*  進む方向・距離
  211.   int walk,fall,wait,wct,tm,tmw    /*  歩行アニメ・落下・ウェイト用、カウンタ、タイマ
  212.   int kn,koin,miss,ck        /*  コイン総数、コイン数、ミス数、チェック
  213.   int stat=-2,rt=0        /*  ステイタス、返り値
  214.   dim str cnt_mes(1)={ "CONTINUE","RETRY" }    /*  カウント時のメッセージ
  215.   dim int mus_dt(14)={2,2,2,2,2,6,6,6,6,4,4,4,7,7,7}    /*  ステージ別曲目
  216.  
  217.   play0(0)
  218.   kd=iocs(4,13)
  219.   while (iocs(4,0) and iocs(4,2) and 2)=0    /*  ループ([ESC]+[Q]:強制終了)
  220.     kd=iocs(4,13)
  221.     if (kd and 16) then rt=3:break    /*  タイトルへ
  222.     if stat<>5 and (kd and 1) then{
  223.       play0(3)
  224.       tm=diff_time(tm)
  225.       if pause()=-1 then rt=-1:break
  226.       tm=diff_time(tm)
  227.       play0(mus_dt(stg-1))
  228.     }
  229.  
  230.     switch stat
  231.       case -2:            /*  初期設定
  232.         sp_set(16,0,0)
  233.         kn=make_stage(stg)
  234.         if kn=-1 then rt=-1 else{    /*  強制終了
  235.           koin=0:miss=0
  236.           energy_ud(e_max)
  237.           print_letters( 96, 84,"STAGE "+right$(" "+str$(stg),2))
  238.           print_letters( 96,112,"HEART: "+str$(heart))
  239.           play0(mus_dt(stg-1))
  240.           tm=iocs(&h7F)
  241.           ck=0:stat=-1
  242.         }
  243.       break
  244.  
  245.       case -1:            /*  左上に戻る
  246.         mx=1:my=1
  247.         xz=24:yz=24:dr=&h4000
  248.         walk=0:fall=0:wait=0
  249.         sp_set(16,24,24,&h4103,3)
  250.         tmw=iocs(&h7F)+MOVE_WAIT
  251.         stat=0
  252.  
  253.       case 0:            /*  メイン
  254.         jd=joy()
  255.         dx=MV_DAT((jd shr 2) and 3)
  256.         dy=MV_DAT(jd and 3)
  257.         if dx then dr=-(dx>0)*&h4000
  258.         dz=E_CNS(dy+1,dx+1)
  259.         if dz then if energy_ud(-dz) then dx=0:dy=0
  260.  
  261.         if ck=0 and diff_time(tm)>240 then tx_cls(92,84,72,36):ck=1
  262.         stat=1
  263.         dz=2:mx2=mx+dx
  264.         if dy then{
  265.           fall=0:my2=my+dy
  266.           if dx=0 then if dy=-1 then dz=4
  267.           if vmap(mx2,my2)=3 then{
  268.             if vmap(mx2,my)=3 then dx=0
  269.             if vmap(mx2,my)<3 or vmap(mx,my2)=3 then dy=0
  270.           }
  271.         } else{
  272.           my2=my+1
  273.           if dx then{
  274.             if vmap(mx2,my)=3 then dx=0
  275.             dy=-(fall>0 and vmap(mx,my2)<3 and vmap(mx2,my2)<3)
  276.             fall=1-fall
  277.           } else fall=0:if vmap(mx,my2)<3 then dy=1:dz=1 else stat=2
  278.         }
  279.         if stat=1 then wct=16/dz:wait=0:tmw=iocs(&h7F)+MOVE_WAIT
  280.         break
  281.  
  282.       case 1:            /*  キャラ移動
  283.         if diff_time(tmw) < MOVE_WAIT then break
  284.         tmw=iocs(&h7F)
  285.         wct=wct-1
  286.         if dx or dy=-1 then if (wct and 3)=0 then walk=1-walk
  287.         xz=xz+dx*dz:yz=yz+dy*dz
  288.         sp_set(16,xz,yz,dr+&h103+walk,3)
  289.         anime()
  290.         if wct>0 then break
  291.  
  292.         mx=mx+dx:my=my+dy
  293.         if vmap(mx,my)=2 then{
  294.           if energy_ud(-e_max/8) then energy_ud(0)        /*  ミス
  295.           tx_cls(92,84,72,36):ck=1
  296.           if music_mode then m_play(42)
  297.           wct=0:stat=3
  298.         } else{
  299.           stat=0
  300.           if vmap(mx,my)=1 then{
  301.             vmap(mx,my)=0:print_bg(0,mx,my,0)            /*  コインを取る
  302.             if music_mode then m_play(41)
  303.             koin=koin+1:print_letters(200,236,right$(" "+str$(koin),2))
  304.             if koin=kn then{
  305.               tm=diff_time(tm):if tm>600000 then tm=600000
  306.               ttm=ttm+tm:if ttm>600000 then ttm=600000
  307.               tx_cls(92,84,72,36)
  308.               play0(9)
  309.               stage_clear(stg,tm,miss,md)    /*  クリア
  310.               tm=iocs(&h7F)
  311.               wct=10-(md=0):walk=0:stat=5
  312.               jd=joy()
  313.             }
  314.           }
  315.         }
  316.         tmw=iocs(&h7F)+MOVE_WAIT
  317.     break
  318.  
  319.       case 2:            /*  キャラ停止中
  320.         if diff_time(tmw) < MOVE_WAIT then break
  321.         tmw=iocs(&h7F)
  322.         wait=wait+1:if wait>15 then wait=8
  323.         if wait=8 then sp_set(16,xz,yz,257,3)
  324.         if wait=12 then sp_set(16,xz,yz,258,3)
  325.         anime()
  326.         if wait=15 then energy_ud(E_RCV)
  327.         stat=0
  328.         break
  329.  
  330.       case 3:            /*  ミス(落下アニメ)
  331.         if bpeek(&hE88001) and &h10  then break
  332.         sp_set(16,xz,yz,&h105+(wct shr 2),3)
  333.         anime()
  334.         wct=(wct+1) and 7:yz=yz+2
  335.         if yz>216 then{
  336.           if miss<100 then miss=miss+1
  337.           if tms<100 then tms=tms+1
  338.           if put_heart(-1)<0 then{
  339.             play0(10)
  340.             ttm=ttm+diff_time(tm):if ttm>600000 then ttm=600000
  341.             print_letters( 92, 84,"GAME OVER")
  342.             print_letters( 80+md*12,112,cnt_mes(md)+"? 10")
  343.             tm=iocs(&h7F)
  344.             walk=-1:wct=10:stat=5:jd=joy()
  345.             tmw=iocs(&h7F)+MOVE_WAIT
  346.           } else{
  347.             print_letters( 92, 84,"MISTAKE !")
  348.             print_letters( 96,112,"HEART: "+str$(heart))
  349.             wct=150:stat=4
  350.           }
  351.         }
  352.         break
  353.  
  354.       case 4:
  355.         if diff_time(tmw) < MOVE_WAIT*10 then break
  356.         if bpeek(&hE88001) and &h10 then break
  357.         wct=wct-1:anime()
  358.         if wct=0 then tx_cls(92,84,72,36):ck=1:stat=-1
  359.         break
  360.  
  361.       case 5:            /*  GAME END
  362.         if (bpeek(&hE88001) and &h10) then break
  363.         if walk>=0 then{
  364.           if diff_time(tmw) >= MOVE_WAIT then{
  365.             tmw=iocs(&h7F)
  366.             walk=walk+1:if walk>3 then walk=0
  367.             sp_set(16,xz,yz,&h105+walk/2,3)    /*  わーい!
  368.           }
  369.         }
  370.         anime()                        /*  アニメ
  371.         pjd=not(jd):jd=joy()                /*  入力
  372.         st=pjd and jd
  373.         if wct<11 then{
  374.           if (jd and 2) then tm=iocs(&h7F)
  375.           if diff_time(tm)>100 or (st and 8) then{    /*  TIME COUNT
  376.             wct=wct-1
  377.             if wct<0 then rt=2:break
  378.             mx2=148:my2=148:if walk<0 then mx2=160+(md<>0)*12:my2=112
  379.             if music_mode then m_play(43)
  380.             print_letters(mx2,my2," "+str$(wct))
  381.             tm=iocs(&h7F)
  382.           }
  383.         }
  384.         if st and 32 then{
  385.           if music_mode and wct<11 then m_play(43)
  386.           if (jd and 4) then rt=3:break
  387.           if md and walk>=0 then if (jd and 3) then rt=6+MV_DAT(jd and 3):break
  388.           if md or walk<0 then{
  389.             if cnt_ct<100 then cnt_ct=cnt_ct+1
  390.             while heart<HEART_CONT:put_heart(1):endwhile    /*  CONTINUE
  391.             stat=-2
  392.           } else rt=1
  393.         }
  394.         if md=0 and walk=0 then if diff_time(tm)>800 then rt=1
  395.         break
  396.  
  397.     endswitch
  398.     if rt then break
  399.  
  400.   endwhile
  401.  
  402.  
  403.   if rt>0 then{        /*  アニメ調整
  404.     while anime_ct<8
  405.       if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
  406.       anime()
  407.     endwhile
  408.   }
  409.  
  410.   return(rt)        /*  rt= 1:CLEAR   2:GAME OVER   3:GO TO TITLE   -1 or 0:[ESC]+[Q]
  411. endfunc
  412.  
  413.  
  414. /******************/
  415. /***  一時停止  ***/
  416. /******************/
  417. func pause()
  418.   int jd,pjd,rt=-1    /*  入力、返り値
  419.   dim int td0(81)={4718628},td1(81)={4718628},td2(81)={4718628}
  420.  
  421.   iocs(&h15,1):iocs(&h1A,92,84,,,,td0)
  422.   iocs(&h15,2):iocs(&h1A,92,84,,,,td1)
  423.   iocs(&h15,4):iocs(&h1A,92,84,,,,td2)
  424.   tx_cls(92,84,72,36)
  425.   print_letters(100,100,"PAUSE !")
  426.   jd=(((joy() shr 5) or iocs(4,13)) and 1)
  427.   while (iocs(4,0) and iocs(4,2) and 2)=0
  428.     pjd=(not jd)
  429.     jd=(((joy() shr 5) or iocs(4,13)) and 1)
  430.     if (jd and pjd) then rt=0:break
  431.   endwhile
  432.   if rt=0 then{
  433.     rt=-1
  434.     while (iocs(4,0) and iocs(4,2) and 2)=0
  435.       if (((joy() shr 5) or iocs(4,13)) and 1)=0 then rt=0:break
  436.     endwhile
  437.   }
  438.   iocs(&h15,1):iocs(&h1B,92,84,,,,td0)
  439.   iocs(&h15,2):iocs(&h1B,92,84,,,,td1)
  440.   iocs(&h15,4):iocs(&h1B,92,84,,,,td2)
  441.  
  442.   return(rt)
  443. endfunc
  444.  
  445.  
  446. /************************/
  447. /***  ステージクリア  ***/
  448. /************************/
  449. func stage_clear(stg,tm,ms,md)    /*  stg: ステージ番号   tm: CLEAR_TIME   ms: MISS   md: MODE
  450.   int z,sv=0
  451.   dim str end_mes(1)={ "GO TO NEXT STAGE","GO TO ENDING!" }
  452.  
  453.   print_letters( 64, 44,"STAGE "+right$("0"+str$(stg),2)+"  CLEAR!")
  454.   print_letters( 72, 68,"TIME:"):print_time(120, 68,tm)
  455.   if md=0 and stg<13 then{
  456.     z=stg-1
  457.     if tm<times(z) or times(z)=-1 then{
  458.       print_letters( 48, 84,"YOUR RECORD IS BEST!")
  459.       print_time((z/6)*104+54,(z mod 6)*14+620,tm)
  460.       times(z)=tm:sv=1
  461.     }
  462.   }
  463.   if prac_max<=stg and stg<12 and md=0 then prac_max=stg+1:sv=1
  464.   if sv then save_rec()
  465.  
  466.   if ms=0 then{
  467.     print_letters( 72,124,"NO MISS CLEAR!")
  468.     if stg<12 and md=0 then{
  469.       if print_emax(e_max+16)=0 then print_letters( 52,140,"MAX.ENERGY RISE UP!")  else {
  470.         if put_heart(1)<=0 then print_letters( 44,140,"YOUR HEART INCREASES!") }
  471.     }
  472.   } else print_letters( 96,124,"MISS: "+right$("0"+str$(ms),2))
  473.   if md then print_letters( 92,148,"RETRY? 10")
  474.   if md=0 then md=-(stg=12):print_letters(96+md*24,180,end_mes(md))
  475.  
  476. endfunc
  477.  
  478.  
  479. /************************/
  480. /***  スタッフロール  ***/
  481. /************************/
  482. func staff()
  483.   int i
  484.   int jd,pjd,sv=0    /*  入力(jd,pjd)、セーブチェック
  485.   int no=3,tm,rt=0    /*  順位、タイマ、返り値
  486.   int TM0=780,TM1=3000    /*  待時間
  487.  
  488.   vpage2(&h20)
  489.   wpoke(&hE80014,256):wpoke(&hE80016,0)        /*  text scroll
  490.   play0(0)
  491.   tm=iocs(&h7F)
  492.   print_letters(456,904,right$("0"+str$(cnt_ct),2))
  493.   print_letters(456,918,right$("0"+str$(tms),2))
  494.   print_time(408,936,ttm)
  495.   while ttm<recs(no-1) or recs(no-1)=-1
  496.     if no<3 then recs(no)=recs(no-1):print_time(66+no*44,557+no*14,recs(no))
  497.     recs(no-1)=ttm:print_time(22+no*44,543+no*14,ttm)
  498.     no=no-1:if no=0 then break
  499.   endwhile
  500.   tx_cls(344,958,144,8)
  501.   if no<3 then print_letters(344,958,"YOUR TIME IS "+RANKS(no)+"!"):sv=1
  502.   if prac_max<15 then prac_max=15:sv=1
  503.   if prac_max=15 and chk_end=0 then{
  504.     chk_end=1
  505.     print_letters(256,1016,"PUSH B BUTTON WHEN SELECT STAGE!")
  506.   } else tx_cls(256,1016,256,8)
  507.  
  508.   play0(8)
  509.  
  510.   fill(14,232,141,241,0)
  511.   print_letters(72,221,"         ")
  512.   print_letters(208,221,"00")
  513.   print_letters(200,236," 0/ 0")
  514.   if clear_screen() then return(-1)
  515.   tl_ck=0
  516.   while (diff_time(tm))<TM0
  517.     if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
  518.   endwhile
  519.  
  520.   if rt=0 then{
  521.     for i=0 to 800        /*  スクロール
  522.       if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
  523.       if (iocs(4,13) and 16) then rt=1:break    /*  タイトルへ
  524.       v_disp()
  525.       wpoke(&hE80016,i)
  526.     next
  527.   }
  528.  
  529.   if rt=0 then{
  530.     if sv then save_rec()
  531.     tm=iocs(&h7F):jd=joy()
  532.     while (diff_time(tm))<TM1            /*  ウエイト
  533.       if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break
  534.       if (iocs(4,13) and 16) then break
  535.       pjd=not(jd):jd=joy():if (pjd and jd) and 32 then break
  536.       if (jd and 2) then tm=iocs(&h7F)
  537.     endwhile
  538.   }
  539.  
  540.   if rt>=0 then{
  541.     vpage2(&h6F)        /*  通常画面に直す
  542.     wpoke(&hE80014,0):wpoke(&hE80016,0)
  543.   }
  544.  
  545.   return(rt)        /*  rt=-1:[ESC]+[Q]
  546. endfunc
  547.  
  548.  
  549. /************************************************/
  550. /***  オプション読取、ファイルチェック・読込  ***/
  551. /************************************************/
  552. func read_file()
  553.   int i,z
  554.   int r0=1,m0=0        /*  file read, music  / (0:off 1:on)
  555.   int err=0,fp        /*  error, file No.
  556.  
  557. /***  オプション読取り  ***/
  558.  
  559. for i=1 to b_argc-1
  560.   z=asc(mid$(b_argv(i),1,1))
  561.   if len(b_argv(i))=2 and (z='/' or z='-') then{
  562.     z=asc(mid$(b_argv(i),2,1))
  563.     if z='s' or z='S' then save_mode=0        /*  /S: 書込禁止
  564.     if z='z' or z='Z' then music_mode=0        /*  /Z: 演奏停止
  565.   }
  566. next
  567.  
  568. /***  ファイルチェック  ***/
  569.  
  570.   for i=0 to 5
  571.     if music_mode=0 and (i=3 or i=4) then continue
  572.     if i=5 and m0 then if y_n("音楽ないけど、いい") then music_mode=0 else end
  573.     if filesnum(FNAME(i),&h21)<>1 then{
  574.       print"「"+FNAME(i)+"」が、ないみたい!"
  575.       if i<3 then err=1 else if i<5 then m0=1
  576.       if i=5 and err=0 then{
  577.         r0=0:if save_mode=0 then break
  578.         save_mode=0
  579.         if (drvctrl(0) and 14)=2 then{
  580.           if y_n("新しい記録ファイル、作る") then{
  581.             fp=fopen(FNAME(5),"c")
  582.             fwrites(HEADER,fp)
  583.             fputc(0,fp):fputc(0,fp):fputc(0,fp)
  584.             fputc(prac_max,fp)
  585.             fwrite(recs,3,fp):fwrite(times,12,fp)
  586.             fclose(fp)
  587.             r0=1:save_mode=1
  588.           }
  589.         }
  590.       }
  591.     }
  592.   next
  593.   if err then print"起動に失敗しちゃった!":end
  594.  
  595.  
  596. /***  レコード読込  ***/
  597.  
  598.   if r0 then{
  599.     fp=fopen(FNAME(5),"r")
  600.     fseek(fp,11,0):prac_max=fgetc(fp)
  601.     fread(recs,3,fp):fread(times,12,fp)
  602.     fclose(fp)
  603.   }
  604.  
  605. endfunc
  606.  
  607.  
  608. /*******************/
  609. /***  Yes or No  ***/
  610. /*******************/
  611. func y_n(mes;str)
  612.   str zs
  613.  
  614.   print mes+"?(Y/N) <中断:[ESC]> ";
  615.   zs=inkey$
  616.   if asc(zs)=&h1B then end
  617.   print zs
  618.  
  619.   return(zs="y" or zs="Y")
  620. endfunc
  621.  
  622.  
  623. /************************/
  624. /***  レコードセーブ  ***/
  625. /************************/
  626. func save_rec()
  627.   int fp
  628.  
  629.   if save_mode then{
  630.     if (drvctrl(0) and 14)=2 then{
  631.       if filesnum(FNAME(5),&h20) then{
  632.         fp=fopen(FNAME(5),"w")
  633.         fseek(fp,11,0):fputc(prac_max,fp)
  634.         fwrite(recs,3,fp):fwrite(times,12,fp)
  635.         fclose(fp)
  636.       }
  637.     }
  638.   }
  639.  
  640. endfunc
  641.  
  642.  
  643. /******************/
  644. /***  初期設定  ***/
  645. /******************/
  646. func init()
  647.  
  648.   int i,j,k,z                /*  雑用
  649.   int fp                /*  file No.
  650.   dim char suf(24),td(11)={0,8,0,8}    /*  PCG DATA(TEXT)   suf: 水面   td: 表示用
  651.   dim int tp(1015),std(23)={3670029},tid(117)={11010070}
  652.   dim int tpal(15)={  0,   832, 32384, 38664, 51020, 63454, 35578, 50558,     /*  TEXT PALET
  653.                     + 0, 16400, 64766, 60474, 56182, 51890, 47662, 43434 }
  654.   dim str sf0(7)={ "CHARACTOR DESIGNER","","FONT DESIGNER","MUSIC BY",        /*  STAFF
  655.                    "SOUND BY","","PEKE-BASIC BY","PROGRAMMER" }
  656.  
  657. /*** 音楽  ***/
  658.  
  659.   if music_mode then{
  660.     m_init()
  661.     m_adpcm_block(FNAME(3))
  662.     zmd_play(FNAME(4))
  663.     play0(3)
  664.   }
  665.  
  666.  
  667. /***  画面設定  ***/
  668.  
  669.   screen 0,3,1,1
  670.   vpage2(0)            /*  表示 OFF
  671.   tx_cls(0,0,512,1024)        /*  テキスト画面クリア
  672.   v_priority("TSG")        /*  プライオリティ設定
  673.  
  674.  
  675. /***  テキスト設定  ***/
  676.  
  677.   fp=fopen(FNAME(0),"r")
  678.   fread(txd,384,fp):fread(suf,24,fp)            /*  DATA 読込み
  679.   fread(tp,1016,fp)
  680.   fclose(fp)
  681.  
  682.   for i=0 to 15:wpoke(&hE82200+i*2,tpal(i)):next        /* TEXT PALET 設定
  683.  
  684.  
  685. /***  スプライト設定  ***/
  686.  
  687.   sp_init()
  688.   spfile_def(FNAME(1),1)    /*  PCG 定義
  689.   palfile_def(FNAME(2),1)    /*  PALET 定義
  690.   block_pal(11)
  691.  
  692.   fp=fopen(FNAME(1),"r")
  693.   fseek(fp, 896,0):fread(amd,288,fp)    /*  アニメ用
  694.   fclose(fp)
  695.  
  696.   sp_clr(0)                /*  PCG0 クリア
  697.   sp_disp(0)                /*  SPRITE & BG 非表示
  698.  
  699.  
  700. /***  BG 面設定  ***/
  701.  
  702.   bg_fill(0,0):bg_fill(1,0)        /*  BG面 クリア
  703.   bg_set(0,0,1):bg_set(1,1,1)        /*  BG面 設定
  704.   bg_scroll(0,0,0):bg_scroll(1,0,0)
  705.  
  706.  
  707. /***  仮想画面周囲設定  ***/
  708.  
  709.   for i=0 to 16:vmap(i,0)=3:vmap(i,13)=3:next
  710.   for j=1 to 12:vmap(0,j)=3:vmap(16,j)=3:next
  711.  
  712.  
  713. /***  初期画面描画  ***/
  714.  
  715.   for i=0 to 15
  716.     bg_put(0,i*2, 0,1311):bg_put(0,i*2+1, 0,1309)    /*  枠 (BG)
  717.     bg_put(0,i*2,31,1310):bg_put(0,i*2+1,31,1308)
  718.     bg_put(0, 0,i*2,1311):bg_put(0, 0,i*2+1,1310)
  719.     bg_put(0,31,i*2,1309):bg_put(0,31,i*2+1,1308)
  720.   next
  721.   for i=0 to 14:sp_set(i,i*16+24,216,1287,3):next    /*  枠 (SPRITE)
  722.  
  723.   for i=1 to 30
  724.     z=1-(i and 1)
  725.     bg_put(1,i,1,1094+z)
  726.     for j=0 to 11
  727.       if j>0 then bg_put(1,i,j*2+1,1096+z)        /*  背景 (BG)
  728.       bg_put(1,i,j*2+2,1098+z)
  729.     next
  730.   next
  731.  
  732.   for j=0 to 2
  733.     for i=0 to 7:td(i+4)=suf(j*8+i):next
  734.     iocs(&h15,1 shl j)
  735.     for z=0 to 2:for i=1 to 30
  736.       iocs(&h1B,i*8,z*256+8,,,,td)        /*  水面 (TEXT)
  737.     next:next
  738.   next
  739.  
  740.   fill(8,216,247,247,8360)                /*  ステイタス (GRAPHIC)
  741.   fill(13,231,142,242,63420)
  742.   fill(14,232,141,241,0)
  743.  
  744.   for j=0 to 2
  745.     print_letters(12,j*256+221,"ENERGY")        /*  ステイタス(文字)
  746.     print_letters(160,j*256+221,"STAGE 00")
  747.     print_letters(160,j*256+236,"COIN  0/ 0")
  748.   next
  749.  
  750.   for k=0 to 3            /*  タイトル画面(チープでごめんね!)
  751.     for i=0 to 115:tid(i+1)=tp(k*116+i+552):next
  752.     iocs(&h15,1 shl k):iocs(&h1B, 44,298,,,,tid)
  753.     iocs(&h15,1 shl k):iocs(&h1B,300, 80,,,,tid)
  754.   next
  755.   print_letters( 64,348,"> START GAME")
  756.   print_letters( 80,364,"PRACTICE  "+right$("0"+str$(prac),2))
  757.   print_letters( 80,380,"EXIT")
  758.   print_letters( 60,416,"1996,2000")
  759.   print_letters(112,428,"TAU SOFTWARE")
  760.   print_letters(256,1004,"THANK YOU FOR PLAYING THIS GAME!")
  761.  
  762.  
  763. /***  BEST RECORDS 画面  ***/
  764.  
  765.   print_letters( 48,540,"@@@ BEST RECORDS @@@")
  766.   for i=0 to 2
  767.     print_letters(36+i*44,557+i*14,RANKS(i))
  768.     print_time(66+i*44,557+i*14,recs(i))
  769.   next:RANKS(0)="BEST"
  770.   print_letters( 28,604,"STAGE"):print_letters(132,604,"STAGE")
  771.   for i=0 to 1:for j=0 to 5
  772.     z=i*6+j
  773.     print_letters(i*104+32,j*14+620,right$("0"+str$(z+1),2)+":")
  774.     print_time(i*104+54,j*14+620,times(z))
  775.   next:next
  776.  
  777.  
  778. /***  STAFF ROLL 画面  ***/
  779.  
  780.   print_letters(348,112,"[STAFF]")
  781.  
  782.   j=268:for i=0 to 7
  783.     if sf0(i)="" then j=j-44 else print_letters(304,j,sf0(i)):j=j+20
  784.     for k=0 to 2
  785.       for z=0 to 22:std(z+1)=tp(i*69+k*23+z):next
  786.       iocs(&h15,1 shl k):iocs(&h1B,408,j,,,,std)
  787.     next:j=j+64
  788.   next
  789.  
  790.   print_letters(280,856,"PRODUCT BY  TAU SOFTWARE")
  791.   print_letters(416,868,"1996,2000")
  792.   print_letters(376,904,"CONTINUE:")
  793.   print_letters(360,918,"TOTAL MISS:")
  794.   print_letters(312,936,"TOTAL TIME:")
  795.  
  796.  
  797. /***  表示  ***/
  798.  
  799.   sp_disp(1)
  800.   vpage2(&h6F)
  801.  
  802. endfunc
  803.  
  804.  
  805. /******************************************/
  806. /***  コイン、ブロック、スライムの配置  ***/
  807. /******************************************/
  808. func make_stage(stg)    /* stg: ステージ番号
  809.  
  810.   int i,j,x,y
  811.   int kc,kn        /*  コイン配置数、コイン数
  812.  
  813.  
  814. /***  配置数・ステージ数・乱数の設定  ***/
  815.  
  816.   kc=5
  817.   randomize(13534)
  818.   for i=1 to stg-1
  819.     for j=0 to kc
  820.       x=rnd():y=rnd()
  821.     next
  822.     kc=(kc+2)*1.25-1.5
  823.   next
  824.  
  825. /*** ゲーム画面の作成  ***/
  826.  
  827.   if clear_screen() then return(-1)        /*  ゲーム画面クリア
  828.   block_pal(stg-1)                    /*  ブロックのパレット設定
  829.   print_letters(208,221,right$(" "+str$(stg),2))    /*  ステージ数の表示
  830.   print_letters(200,236," 0/ 0")            /*  コイン表示クリア
  831.  
  832.   kn=0
  833.   for i=1 to kc
  834.     if (iocs(4,0) and iocs(4,2) and 2) then kn=-1:break    /*  強制終了
  835.     x=rnd()*13+2:y=rnd()*10+2
  836.     if vmap(x,y)<>1 then{
  837.       print_bg(0,x,y,2+((x+y) mod 6))                /*  コインの表示
  838.       vmap(x,y)=1
  839.       kn=kn+1
  840.       print_letters(224,236,right$(" "+str$(kn),2))        /*  コイン数の表示
  841.     }
  842.     if vmap(x,y+1)=0 then print_bg(0,x,y+1,1):vmap(x,y+1)=3            /*  ブロック
  843.     if vmap(x,y-1)=0 then print_bg(0,x,y-1,8+((x+y) mod 3)):vmap(x,y-1)=2    /*  スライム
  844.   next:x=rnd():y=rnd()
  845.  
  846.   return(kn)    /*  コイン数返す(-1:[ESC]+[Q])
  847. endfunc
  848.  
  849.  
  850.  
  851. /*****************************************/
  852. /***  入力(キーボード&ジョイパッド) ***/
  853. /*****************************************/
  854. func joy()
  855.  
  856.   int k3,k6,k7,k8,k9,kE,jd
  857.  
  858.   k3=iocs(4,3):kE=iocs(4,14)
  859.   k6=iocs(4,6):k7=iocs(4,7)
  860.   k8=iocs(4,8):k9=iocs(4,9)
  861.  
  862.   jd=not(iocs(&h3B,0)) and &h00FF            /*  ジョイパッド
  863.   jd=jd or (((k7 or k8) shr 4) and 1)            /*  上
  864.   jd=jd or (((k7 shr 5) or (k9 shr 3)) and 2)        /*  下
  865.   jd=jd or (((k7 shr 1) or (k8 shr 5)) and 4)        /*  左
  866.   jd=jd or (((k7 shr 2) or (k9 shl 2)) and 8)        /*  右
  867.   jd=jd or ((k3 or k6 or (k9 shr 1) or (k9 shl 5)) and 32)    /*  ボタン(A)
  868.   jd=jd or (((kE shl 4) or (k9 shr 1)) and 64)            /*  ボタン(B)
  869.  
  870.   return(jd)
  871. endfunc
  872.  
  873.  
  874. /****************/
  875. /***  時間差  ***/
  876. /****************/
  877. func diff_time(tm)
  878.   return((iocs(&h7F)-tm+8640000) mod 8640000)
  879. endfunc
  880.  
  881.  
  882. /********************/
  883. /***  拡張 vpage  ***/
  884. /********************/
  885. func vpage2(vp)
  886.   bpoke(&hE82601,vp and &hFF)
  887. endfunc
  888.  
  889.  
  890. /******************************************/
  891. /***  コイン&スライムのアニメーション  ***/
  892. /******************************************/
  893. func anime()
  894.   int i
  895.   dim int amd2(31)
  896.  
  897.   for i=0 to 31:amd2(i)=amd(ac2(anime_ct)+i):next
  898.   iocs(&hC4,anime_ct+8,1,,,,amd2)            /*  PCG再定義
  899.  
  900.   anime_ct=anime_ct+1:if anime_ct=9 then anime_ct=0
  901.   ac2(anime_ct)=ac2(anime_ct)+32
  902.   if ac2(anime_ct)=288 then ac2(anime_ct)=192 else if ac2(anime_ct)=192 then ac2(anime_ct)=0 
  903.  
  904. endfunc
  905.  
  906.  
  907. /********************************/
  908. /***  ブロックのパレット設定  ***/
  909. /********************************/
  910. func block_pal(no)
  911.   int i,cl
  912.  
  913.   for i=2 to 5
  914.     if no<12 then cl=hsv(no*16,17-i,i*5+3) else cl=hsv((no mod 3)*64+16,12+i,31-i*5)
  915.     sp_color(i,cl,5)
  916.   next
  917.  
  918. endfunc
  919.  
  920.  
  921. /*****************/
  922. /***  BG 描画  ***/
  923. /*****************/
  924. func print_bg(pn,x,y,no)    /* pn : プレーン No.   x,y: 座標   no: 描画パターン
  925.   int i
  926.   dim int pal_block(10)={ 0, 5, 2, 2, 2, 2, 2, 2, 3, 3, 3 }    /*  描画パレットブロック
  927.  
  928.   x=x*2-1:y=y*2-1                /*  座標修正
  929.   no=pal_block(no)*256+no*4            /*  パターンデータ算出
  930.   if no>0 then no=no+24
  931.  
  932.   for i=0 to 3
  933.     bg_put(pn,x+(i/2),y+(i and 1),no+i)        /*  描画
  934.   next
  935.  
  936. endfunc
  937.  
  938.  
  939. /**************************/
  940. /***  HEART(REST) 表示  ***/
  941. /**************************/
  942. func put_heart(ud)    /*  ud: 増減値(ud<0:-1   ud>0:+1   ud=0: 初期表示(heart=HEART_0))
  943.   int x
  944.   str ch="@"
  945.  
  946.   if ud>0 then ud=1 else ud=-1
  947.   if heart+ud<0 or heart+ud>HEART_MAX then return(ud)        /* 最小(-1)、最大(1)
  948.  
  949.   heart=heart+ud
  950.   x=144-heart*8
  951.   if ud<0 then x=x-8:ch=" "
  952.   print_letters(x,221,ch)        /*  表示
  953.  
  954.   return(0)
  955. endfunc
  956.  
  957.  
  958. /***************************/
  959. /***  ENERGY METER 表示  ***/
  960. /***************************/
  961. func energy_ud(ud)    /*  ud: 増減値 (ud=0 クリア)
  962.   int i,x,cl,sign
  963.  
  964.   if ud=0 then energy=0:fill(14,232,13+e_max,241,0):return(-1)    /*  energy=0
  965.  
  966.   sign=1
  967.   if ud<0 then{
  968.     if energy+ud<0 then return(-1)        /*  energy<0 の時 -1 返す
  969.     sign=-1:ud=-ud
  970.   }
  971.  
  972.   for i=1 to ud
  973.     if sign>0 and energy>=e_max then break
  974.     x=energy+13:cl=0
  975.     energy=energy+sign
  976.     if sign>0 then x=x+1:cl=hsv(energy,31,24)
  977.     line(x,232,x,241,cl)                /*  表示
  978.   next
  979.  
  980.   return(0)
  981. endfunc
  982.  
  983. /***************************/
  984. /***  ENERGY 最大値表示  ***/
  985. /***************************/
  986. func print_emax(mx)    /* mx: e_max 値
  987.   int rt=0
  988.  
  989.   if mx>ENERGY_MAX then mx=ENERGY_MAX:rt=-1
  990.   if energy<mx then fill(14+energy,232,13+mx,241,0)
  991.   if mx<ENERGY_MAX then fill(14+mx,232,13+ENERGY_MAX,241,8360)
  992.   e_max=mx
  993.  
  994.   return(rt)        /*  -1: e_max>ENERGY_MAX
  995. endfunc
  996.  
  997.  
  998.  
  999. /********************/
  1000. /***  タイム表示  ***/
  1001. /********************/
  1002. func print_time(x,y,tm)        /*  x,y: 始点座標   tm: タイム( -1; --'--.-- )
  1003.   str tm_st="**'**.**"        /*  タイム表示用文字列
  1004.  
  1005.   if tm<600000 then{
  1006.     if tm>=0 then{
  1007.       tm_st=right$(" "+str$(tm/6000),2)+"'"
  1008.       tm_st=tm_st+right$("0"+str$((tm/100) mod 60),2)+"."+right$("0"+str$(tm mod 100),2)
  1009.     } else tm_st="--'--.--"
  1010.   }
  1011.   print_letters(x,y,tm_st)
  1012.  
  1013. endfunc
  1014.  
  1015.  
  1016. /*************************/
  1017. /***  文字表示 (TEXT)  ***/
  1018. /*************************/
  1019. func print_letters(x,y,st;str)
  1020.   int lc,ch,pn
  1021.   dim int td(2)={524296},td2(2)={524296}    /* xl=8:yl=8
  1022.  
  1023.   for lc=1 to len(st)
  1024.     ch=asc(mid$(st,lc,1))*2-64
  1025.     td2(1)=0:td2(2)=0
  1026.     for pn=0 to 2
  1027.       td(1)=txd(pn*128+ch):td(2)=txd(pn*128+ch+1)    /*  文字 PCG 読込み
  1028.       td2(1)=td2(1) or td(1):td2(2)=td2(2) or td(2)
  1029.       iocs(&h15,1 shl pn):iocs(&h1B,x,y,,,,td)        /*  文字表示
  1030.     next
  1031.     x=x+8
  1032.   next
  1033.  
  1034. endfunc
  1035.  
  1036.  
  1037. /**************************/
  1038. /***  ゲーム画面クリア  ***/
  1039. /**************************/
  1040. func clear_screen()
  1041.   int i,j,rt=0
  1042.  
  1043.   sp_set(16,0,0)            /*  スプライトクリア
  1044.   tx_cls(8,24,240,176)            /*  テキストクリア
  1045.   for j=1 to 12:for i=1 to 15
  1046.     if (iocs(4,0) and iocs(4,2) and 2) then rt=-1:break    /*  強制終了
  1047.     vmap(i,j)=0:print_bg(0,i,j,0)        /*  ゲーム画面のクリア
  1048.   next:next
  1049.  
  1050.   return(rt)    /* rt= 0:正常終了   -1:強制終了
  1051. endfunc
  1052.  
  1053.  
  1054. /****************************/
  1055. /***  テキスト画面クリア  ***/
  1056. /****************************/
  1057. func tx_cls(x0,y0,xl,yl)    /*  x0,y0: 始点    xl,yl: 大きさ
  1058.   dim int td(16384)
  1059.  
  1060.   td(0)=xl*65536+yl
  1061.   wpoke(&hE8002A,&h1F0)        /*  TEXT 同時アクセス
  1062.   iocs(&h15,1)            /*  TCOLOR
  1063.   iocs(&h1B,x0,y0,,,,td)    /*  TEXTPUT
  1064.   wpoke(&hE8002A,0)
  1065.  
  1066. endfunc
  1067.  
  1068.  
  1069.  
  1070. /******************/
  1071. /***  音楽演奏  ***/
  1072. /******************/
  1073. func play0(no)        /*  曲番号 ( 0:fade out )
  1074.  
  1075.   if music_mode then{
  1076.     if no>0 and no<11 then{
  1077.       m_stop()
  1078.       m_fadeout(0)
  1079.       m_play(no*4-3,no*4-2,no*4-1,no*4)
  1080.     } else m_fadeout(85)
  1081.   }
  1082. endfunc
  1083.